#include <bits/stdc++.h>
using namespace std;


int helper(vector<vector<int>>& tri, int i, int j, vector<vector<int>>& dp){
	int n = tri.size() ;
	
	for(int j = 0; j < n; j++ ){
			dp[n-1][j] = tri[n-1][j] ;
		}
		
		for(int i = n-2; i >= 0; i--){
			for(int j = i; j >= 0; j-- ){
				dp[i][j] = tri[i][j] + max(dp[i+1][j] , dp[i+1][j+1]) ;
			}
		}
		
		return dp[0][0] ;
	
	
}


int maxSumPath(vector<vector<int>>& tri) {
	int n = tri.size() ;
	
	vector<vector<int>> dp(n, vector<int>(n, -1) ) ;
	
	return helper(tri, 0, 0, dp) ;
}


int main()
{
	vector<vector<int> > tri{ { 1 },
							{ 2, 1 },
							{ 3, 3, 2 } };
	cout << maxSumPath(tri);
	return 0;
}
